package conf

import (
	"flag"
	"time"

	"gitee.com/krio/ginc/example/util/cmdprint"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

var (
	C        *Config // 配置信息
	filePath string  // 配置地址
)

// InitConfig 初始化配置信息
func InitConfig() {
	// flag自定义配置地址
	flag.StringVar(&filePath, "c", "./conf/config.yaml", "配置地址")
	flag.Parse()
	viper.SetConfigFile(filePath)
	viper.WatchConfig()
	// 设置回调函数，当配置文件发生变化时，这个函数将被调用
	viper.OnConfigChange(func(in fsnotify.Event) {
		// 在这里处理配置文件变化后的逻辑，例如重新加载配置等。
		err := reloadConfig(filePath)
		if err != nil {
			return
		}
		cmdprint.CmdSuccess("配置更新了: %s", time.Now().Format("2006-01-02 15:04:05"))
	})
	if err := viper.ReadInConfig(); err != nil {
		cmdprint.CmdFatal("获取配置失败: %+v", err)
	}
	if err := viper.Unmarshal(&C); err != nil {
		cmdprint.CmdFatal("配置解析失败: %+v", err)
	}
	cmdprint.CmdSuccess("配置地址: %s", filePath)
}

// 重新加载配置
func reloadConfig(file string) error {
	viper.SetConfigFile(file)
	// 设置回调函数，当配置文件发生变化时，这个函数将被调用
	if err := viper.ReadInConfig(); err != nil {
		return err
	}
	if err := viper.Unmarshal(&C); err != nil {
		return err
	}
	return nil
}
